/*
 * 颜色字段索引处理器 - 颜色字段的Lucene索引处理
 * 
 * 主要功能：
 * - 为ColorField实现Lucene文本搜索索引
 * - 支持颜色字段的全文搜索
 * - 演示内容字段的索引处理
 * - 提供文本搜索的索引支持
 */

using Lombiq.TrainingDemo.Fields;
using OrchardCore.Indexing;
using System.Threading.Tasks;

namespace Lombiq.TrainingDemo.Indexing;

/// <summary>
/// 颜色字段索引处理器 - 为ColorField实现Lucene文本搜索索引
/// 
/// 主要用途：
/// - 为ColorField实现Lucene文本搜索索引
 //* - 支持颜色字段的全文搜索
 //* - 演示内容字段的索引处理
 //* - 提供文本搜索的索引支持
 //* 
 //* 使用场景：
/// - 为颜色字段提供全文搜索功能
/// - 支持颜色名称的文本搜索
/// - 实现内容字段的Lucene索引
/// - 提供高效的文本搜索支持
/// 
/// 设计原因：
/// - 为内容字段提供文本搜索支持
/// - 实现Lucene索引的集成
/// - 支持颜色字段的搜索功能
/// - 提供可扩展的索引处理机制
/// 
/// 设计模式：
/// - 处理器模式：继承ContentFieldIndexHandler<T>实现索引处理
/// - 索引模式：使用Lucene进行文本搜索索引
/// - 键模式：使用context.Keys管理索引键
/// - 设置模式：使用context.Settings配置索引选项
/// </summary>
// IndexHandlers与IndexProviders不同。虽然IndexProviders将在SQL数据库中存储索引值以索引文档，
// 但IndexHandlers将使用文本搜索索引提供程序（例如Lucene）来索引数据。这样，文本搜索将由索引服务执行。
// 不要忘记在服务提供程序中注册此类（请参阅：Startup.cs）。
public class ColorFieldIndexHandler : ContentFieldIndexHandler<ColorField>
{
    /// <summary>
    /// 构建索引方法 - 为ColorField构建Lucene索引
    /// 
    /// 功能说明：
    /// - 为ColorField的颜色名称建立文本索引
    /// - 使用context.Keys管理索引键
    /// - 使用context.Settings配置索引选项
    /// - 支持颜色字段的全文搜索
    /// 
    /// 索引逻辑：
    /// - 获取索引设置选项
    /// - 遍历所有索引键
    /// - 将颜色名称添加到索引文档
    /// - 支持多个索引键的索引
    /// 
    /// 索引内容：
    /// - 颜色名称将作为文本被索引
    /// - 键标识给定内容项索引文档中的一段文本
    /// - 不同命名的字段将有不同的键
    /// </summary>
    /// <param name="field">要索引的ColorField</param>
    /// <param name="context">构建字段索引上下文</param>
    /// <returns>完成的任务</returns>
    public override Task BuildIndexAsync(ColorField field, BuildFieldIndexContext context)
    {
        var options = context.Settings.ToOptions();

        foreach (var key in context.Keys)
        {
            // 颜色名称将被索引。键标识给定内容项索引文档中的一段文本。
            // 例如，两个字段（当然命名不同）将有不同的键。
            context.DocumentIndex.Set(key, field.ColorName, options);
        }

        return Task.CompletedTask;
    }
}

// 训练部分结束：在Lucene中索引内容字段

// 下一站：Views/ColorField.Option.cshtml
